<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 14-5-12
 * Time: 下午10:33
 */
namespace builder\controllers;

use Ulue;
use ulue\web\Module;
use ulue\libs\DirFile;
use builder\parts\BaseController;


class ModuleController extends BaseController
{
    public $modules; //模块列表
    public $needBuildModule; //需要新创建的模块
    static public $c_msg; //需要新创建的模块

    public function init()
    {
        parent::init();

        $this->pageTitle .= '模块创建页';
    }

    public function indexAction()
    {
        // //进行模块检查
        $this->checkModule();

        // //检查是否有新模块需要创建
        // if ( !empty($this->needBuildModule) ){
        //     //通过配置文件自动创建模块
        //     self::$c_msg = $this->autoCreateModule();
        // }

        if ( $module = Ulue::$app->getRequest()->getPost('create_module') ){

            //填入了 创建模块项
            self::$c_msg = $this->createModule($module);
        }

        $this->assign(array(
            'module' => $this->modules,
            'c_msg'  => self::$c_msg
        ) );

        return $this->display();

    }

    private function createModule($module)
    {
        //得到所有模块的列表
        $mArr = $this->modules;
        //fp_die($mArr);

        //检查模块是否已经存在
        if (in_array($module,$mArr)){
            $this->errorJump('',5,'模块 [<em>'.$module.'</em>] 已存在!请检查模块名是否是正确或者删除它重新创建...');
            return false;
        }

        if (!is_dir( MODULE_PATH )) DirFile::createDir( MODULE_PATH );
        $post = IX('post.*');
        //dump($post,1);

        $moduleConfigFile = self::setConfig($module);

        #将要创建的目录及文件
        $dir_file=array(
            MODULE_PATH.$module.'/helper'                =>'',
            MODULE_PATH.$module.'/config/config.php'        => $moduleConfigFile,
            MODULE_PATH.$module.'/'.Ulue::$app->get('system.m_layer').'/index.html' =>'error:请正确访问',
            MODULE_PATH.$module.'/'.Ulue::$app->get('system.v_layer').'/index.html' =>'error:请正确访问',
            MODULE_PATH.$module.'/'.Ulue::$app->get('system.c_layer').'/index.html' =>'error:请正确访问'
        );

        DirFile::createDirAndFile( $dir_file ); //  创建MVC目录及index.html安全文件

        #是否保留index.html 文件
        if ( $post['create_index'] ){
            foreach($dir_file as $key =>$file){
                if (strpos($key, 'index.html') !==false) {
                    unlink($key);//删除index.html文件
                }
            }
        }

        #创建测试控制器文件
        if ( $post['create_test'] ){
            $test_file      = MODULE_PATH.$module.'/'.Ulue::$app->get('system.c_layer').'/TestController.php';
            $test_view_file = MODULE_PATH.$module.'/'.Ulue::$app->get('system.v_layer').'/test/test.html';
            $data           = $this->setloadViewTestData($test_file,$module);

            #创建测试文件
            DirFile::createDirAndFile( array(
                $test_file      => $data['controller'],
                $test_view_file => $data['view'],
                ) );

            #创建完后跳转到测试页面
            if ( $post['jump_test'] ){
                $testUrl    = UX($module.'/test/index');
                $this->successJump($testUrl,6,
                    'yeah!模块[ <strong class="create_success">'.$module.' </strong>]创建成功啦....',1,'测试页面');
            }
        }
        $c_msg = '模块[ <strong class="create_success"> '.$module.' </strong> ]创建成功...<br>';
        return empty($c_msg)? '': $c_msg;
    }
    /**
     * 设置模块配置文件
     * @param [string] $module [将创建的模块]
     */
    static private function setConfig($module)
    {
        $config = <<<STRDOC
<?php
// 配置
return array(
    'default_controller'  =>'test'       //默认控制器 可更改为首页 index
    //自动加载 目录中的所有('application.helper.*')或单个文件'application.helper.test'
    ,'auto_import'         =>array( 'application.$module.helper.*' )
    //,'theme'                =>''

);
STRDOC;
        return $config;
    }
    // 通过配置文件 配置'add_module'项添加的模块 ，将在打开页面后自动创建
    private function autoCreateModule(){

        //需要新创建的模块
        $mArr = $this->needBuildModule;
        if (!is_dir( MODULE_PATH )) DirFile::createDir( MODULE_PATH );
        $c_msg = '';
        foreach($mArr as $v){
            if (!is_dir( MODULE_PATH.$v )) {
                $moduleConfigData   = self::setConfig($v);
                $data               = $this->setloadViewTestData($test_file,$module);
                $test_file          = MODULE_PATH.$module.'/'.Ulue::$app->get('system.c_layer').'/TestController.php';
                $test_view_file     = MODULE_PATH.$module.'/'.Ulue::$app->get('system.v_layer').'/test/test.html';
                $dir_file           = array(
                    $test_file                                      => $data['controller'],
                    $test_view_file                                 => $data['view'],
                    MODULE_PATH.$module.'/helper'                =>'',
                    MODULE_PATH.$module.'/config/config.php'        => $moduleConfigData,
                    MODULE_PATH.$v.'/'.Ulue::$app->get('system.m_layer').'/index.html' =>'error',
                    MODULE_PATH.$v.'/'.Ulue::$app->get('system.v_layer').'/index.html' =>'error',
                    MODULE_PATH.$v.'/'.Ulue::$app->get('system.c_layer').'/index.html' =>'error',
                );
                #  创建目录及文件
                DirFile::create_dir_file( $dir_file );

            } else {
                notice('模块[ <span class="create_error">'.$v.' ]已存在!将跳过创建它...</span>');
                return false;
            }
            $c_msg .= '模块[<strong class="create_success"> '.$v.' </strong>]自动创建成功...<br>';
        }

        return empty($c_msg)? '': $c_msg;

    }
     //删除模块
    public function delete()
    {

        if (IX('get.name')){
            $moduleName = IX('get.name');
            #得到受保护的模块列表
            if ( strpos(Ulue::$app->get('need_pwd'),',')!==false ){
                $protected_module = explode(',', Ulue::$app->get('need_pwd'));
            } else {
                $protected_module = array(Ulue::$app->get('need_pwd'));
            }
            //dump($moduleName);
            #检查
            if ( in_array($moduleName,$protected_module) ){
                $this->pageTitle = 'Gaa - 模块删除页';
                $this->assign(array(
                    'menu'=>$this->menu,
                    'name'=>$moduleName ));
                $this->display('delete_form');
                exit;
            }
            $module_path = MODULE_PATH.IX('get.name');
        } else if (IX('post.delete_pwd')){

            $moduleName = IX('post.name');
            $delete_pwd = IX('post.delete_pwd');
            if ( $delete_pwd !== Ulue::$app->get('delete_pwd')) {
                $this->errorJump(_CONTROLLER_.'index',5,
                    '密码错误！模块[<strong class="create_success"> '.$moduleName.'</strong> ]删除失败',1,
                    '模块创建页面');
                return false;
            }

            $module_path = MODULE_PATH.IX('post.name');
            //dump($delete_pwd);
        } else {
            $this->errorJump(_CONTROLLER_.'/index');
            return false;
        }

        //dump($module_path,1);
        #开始删除模块
        if ( DirFile::delete($module_path) ){
            $this->successJump(_CONTROLLER_.'/index',6,
                '模块[<strong class="create_success"> '.$moduleName.'</strong> ]删除成功',1,'模块创建页面');
        } else {
            $this->errorJump(_CONTROLLER_.'/index',6,
                '模块[<strong class="create_success"> '.$moduleName.'</strong> ]删除失败',1,'模块创建页面');
        }
        return true;
        //$this->display('index');
    }
    //检查模块是否已经创建，并得到 模块列表 和 需要新创建的模块列表
    private function checkModule()
    {
        //fecho(Ulue::$app->get('add_module'));
        $this->modules = Module::names();
        $modules = Ulue::$app->get('add_module');

        if (is_string($modules)){
            if (strpos($modules,',')!==false)
                $modulesArr = explode(',',$modules);
            else
                $modulesArr = array($modules);
        } else if (is_array($modules)){
            $modulesArr = $modules;
        } else {
            //error('没有模块需要创建，如要添加模块，请在配置文件config.php 添加配置 add_module 项');
            return false;
        }

        $needBuild = array();

        foreach($modulesArr as $v){
            if (!is_dir( MODULE_PATH.$v )) {
                $needBuild[] = $v;
            } else {
                continue;
            }
        }

        $this->needBuildModule = $needBuild;

        return true;
    }

    //设置测试控制器页面内容
    private function setSimpleTestData($test_file,$module,$controller='Test')
    {
        $test_file = str_replace(array(SITE_PATH,'\\'),'/',$test_file);
        //应用配置文件
        $config_file = str_replace(array(SITE_PATH,'\\'),'/',GeeInit::start()->appDirs['config'].'config.php' );
        //核心配置文件
        $core_config_file =str_replace(array(SITE_PATH,'\\'),'/', CORE_PATH.'init.config.php' );
        $namespaceModule = $module;
        $data['controller'] =<<<STRDOC
<?php
/*
 * 测试页面
 * */
namespace $namespaceModule\controller;
use ulue\web\Controller;
class TestController extends Controller{
    public function index(){
        \$this->showHtml("<div style='width:800px;margin:100px auto;'>
        <h1 style='text-align:center;color:#f60;border-bottom:#ccc solid 1px;'>欢迎来到测试页面！</h1>
        <p>hello,你好呀！<br>这是[<strong> $module </strong>]模块下的[<strong> $controller </strong>] 测试控制器页面，
        <br>它在：$test_file
        </p>
        <p>基本应用配置文件：$config_file<br>
        更详细的核心配置在：$core_config_file <br>
        请参照它谨慎配置！！
        </p>
        </div>");
    }
}
STRDOC;
    return $data['controller'];

}
//设置测试控制器页面内容
    private function setloadViewTestData($test_file,$module,$controller='Test')
    {
        $test_file_name = basename($test_file);
        $namespaceModule = $module;
        $data['controller'] =<<<STRDOC
<?php
/*
 * 测试页面
 * */
namespace $namespaceModule\controller;
use ulue\web\Controller;
class TestController extends Controller{
    public \$pageTitle = '测试控制器页面';
    public function index(){
        \$test_file             = str_replace('\\\', '/', CONTROLLER_PATH.'$test_file_name');
        //主应用配置文件
        \$main_config_file      = str_replace(array(SITE_PATH,'\\\'),'/',COMM_PATH.'config/config.php' );
        //当前模块配置文件
        \$module_config_file    = str_replace(array(SITE_PATH,'\\\'),'/',MODULE_PATH.MODULE.'/config/config.php' );
        //核心配置文件[请尽量不要直接在这个文件更改添加操作]
        \$core_config_file      = str_replace(array(SITE_PATH,'\\\'),'/', SYS_PATH.'coreConfig.php' );
        \$arr_data = array(
            'test_file'                         => \$test_file,
            'module_config_file'                => \$module_config_file,
            'main_config_file'                  => \$main_config_file,
            'core_config_file'                  => \$core_config_file,
            );
        \$this->show('test',\$arr_data);
    }
}
STRDOC;
        $data['view'] = <<<STRDOC
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><?php echo Ulue::\$app->controller->pageTitle;?> </title>
</head>
<body>

    <div style='width:800px;margin:100px auto;'>
        <h1 style='text-align:center;color:#f60;border-bottom:#ccc solid 1px;'>欢迎来到测试页面！</h1>
        <p>hello,你好呀！<br>这是[<strong> $module </strong>]模块下的[<strong> $controller </strong>] 测试控制器页面，
        <br>它在：<?php echo \$test_file ;?>
        </p>
        <p>
        当前模块配置文件：<?php echo \$module_config_file;?><br>
        主应用配置文件：<?php echo \$main_config_file;?><br>
        更详细的核心配置在：<br>
        &nbsp;&nbsp;&nbsp;<?php echo \$core_config_file ;?> [请尽量不要直接在这个文件进行更改添加操作]<br>
        请参照它谨慎配置！！
        </p>
    </div>

</body>
</html>
STRDOC;
        return $data;
    }

}